perm filename XWORD.SAI[PUZ,HPM] blob sn#152739 filedate 1975-04-01 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "XWORD"
C00004 00003	      IF I MOD 2=0 THEN
C00007 00004	      ELSE
C00010 00005	      IF FOUND=FALSE THEN
C00012 ENDMK
C⊗;
BEGIN "XWORD"
REQUIRE "DDSUB.SAI[GRA,HPM]" SOURCE_FILE;
INTEGER SIZE,I,J,K,L,M,N,O,CHN,DICSIZ,DICSTP,CNT,BRK,EOF,FLG;

OUTSTR("PUZZLE SIZE:"); SIZE←CVD(INCHWL);
OUTSTR("NO OF DICTIONARY WORDS:"); DICSIZ←CVD(INCHWL);
OUTSTR("DICTIONARY STEP SIZE:"); DICSTP←CVD(INCHWL);
OUTSTR("CHANNEL "&CVOS(CHN←GDDCHN(-1))&'15&'12);
DDINIT;
SCREEN(-1,-1,SIZE+1,SIZE+1);
DRKEN; RECTAN(-1000,-1000,1000,1000);
LITEN;
FOR K←0 STEP 1 UNTIL SIZE DO
   BEGIN
   LINE(0,K,SIZE,K);
   LINE(K,0,K,SIZE);
   END;
DPYUP(CHN);
SHOW(CHN);


   BEGIN
   INTEGER ARRAY XWRD[1:SIZE,1:SIZE],CHOICE[1:2*SIZE];
   STRING ARRAY WORDS[1:DICSIZ];
   OPEN(1,"DSK",0,2,0,30,BRK,EOF);
   LOOKUP(1,"DICT",FLG);
   SETBREAK(1,'12," "&'15&'13&'14,"INS");
   FOR K←1 STEP 1 UNTIL DICSIZ DO
   FOR L←1 STEP 1 UNTIL DICSTP DO
   DO WORDS[K]←INPUT(1,1) UNTIL LENGTH(WORDS[K])=SIZE;

   CLOSE(1);

 FOR K←1 STEP 1 UNTIL DICSIZ DO OUTSTR(""""&WORDS[K]&""" ");

   I←1;
   FOR J←1 STEP 1 UNTIL 2*SIZE DO CHOICE[J]←1;
   WHILE I≤2*SIZE DO
      BEGIN
      BOOLEAN FOUND;
      J←(I+1)%2;
      K←CHOICE[I];
      FOUND←FALSE;

      IF I MOD 2=0 THEN
         BEGIN
         WHILE K≤DICSIZ ∧ ¬FOUND DO
            BEGIN
            L←1;
            WHILE L≤J ∧ WORDS[K][L TO L]=XWRD[J,L] DO L←L+1;
            IF L>J THEN
               BEGIN
               BOOLEAN POSSY,FOUNDUM,MATCH;
               FOR L←J STEP 1 UNTIL SIZE DO XWRD[J,L]←WORDS[K][L TO L];
               comment  check on all the partial words;
               POSSY←TRUE;
               M←J+1;
               WHILE M≤SIZE ∧ POSSY DO
                  BEGIN
                  comment  match each against the dictionary;
                  N←1;
                  MATCH←FALSE;
                  WHILE N≤DICSIZ ∧ ¬MATCH DO
                     BEGIN
                     comment  look at each of the first J letters;
                     O←1;
                     FOUNDUM←TRUE;
                     WHILE O≤J ∧ FOUNDUM DO
                        BEGIN
                        IF XWRD[O,M]≠WORDS[N][O TO O] THEN FOUNDUM←FALSE;
                        O←O+1;
                        END;
                     N←N+1;
                     MATCH←MATCH ∨ FOUNDUM;
                     END;
                  M←M+1;
                  POSSY←POSSY ∧ MATCH;
                  END;
               IF POSSY THEN 
                  BEGIN
                  FOUND←TRUE;
                  CHOICE[I]←K+1;
                  END
               ELSE K←K+1;
               END
            ELSE K←K+1;
            END;
         END
      ELSE
         BEGIN
         WHILE K≤DICSIZ ∧ ¬FOUND DO
            BEGIN
            L←1;
            WHILE L<J ∧ WORDS[K][L TO L]=XWRD[L,J] DO L←L+1;
            IF L≥J THEN
               BEGIN
               BOOLEAN POSSY,FOUNDUM,MATCH;
               FOR L←J STEP 1 UNTIL SIZE DO XWRD[L,J]←WORDS[K][L TO L];
               comment  check on all the partial words;
               POSSY←TRUE;
               M←J;
               WHILE M≤SIZE ∧ POSSY DO
                  BEGIN
                  comment  match each against the dictionary;
                  N←1;
                  MATCH←FALSE;
                  WHILE N≤DICSIZ ∧ ¬MATCH DO
                     BEGIN
                     comment  look at each of the first J letters;
                     O←1;
                     FOUNDUM←TRUE;
                     WHILE O≤J ∧ FOUNDUM DO
                        BEGIN
                        IF XWRD[M,O]≠WORDS[N][O TO O] THEN FOUNDUM←FALSE;
                        O←O+1;
                        END;
                     N←N+1;
                     MATCH←MATCH ∨ FOUNDUM;
                     END;
                  M←M+1;
                  POSSY←POSSY ∧ MATCH;
                  END;
               IF POSSY THEN 
                  BEGIN
                  FOUND←TRUE;
                  CHOICE[I]←K+1;
                  END
               ELSE K←K+1;
               END
            ELSE K←K+1;
            END;
         END;
      IF FOUND=FALSE THEN
         BEGIN
         CHOICE[I]←1;
         I←I-1;
         END
      ELSE
         BEGIN
         DRKEN; RECTAN(-1000,-1000,1000,1000);
         LITEN;

         FOR K←0 STEP 1 UNTIL SIZE DO
            BEGIN
            LINE(0,K,SIZE,K);
            LINE(K,0,K,SIZE);
            END;

         FOR K←1 STEP 1 UNTIL SIZE DO
         FOR L←1 STEP 1 UNTIL (I+1)%2 DO
            BEGIN
            TXTPOS(K-.7,SIZE-L+.3,.5,.5);
            TEXT(XWRD[K,L]);
            END;

         FOR K←1 STEP 1 UNTIL I%2 DO
         FOR L←1 STEP 1 UNTIL SIZE DO
            BEGIN
            TXTPOS(K-.7,SIZE-L+.3,.5,.5);
            TEXT(XWRD[K,L]);
            END;
        
         DPYUP(CHN);
         SHOW(CHN);

         I←I+1;
         END;
      END;
   END;
END;